package cn.cleanarch.infra.idp.s3.service;

import cn.cleanarch.infra.idp.s3.domain.entity.S3Config;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * S3操作服务接口
 */
public interface S3Service {

    /**
     * 上传文件到S3
     *
     * @param config S3配置
     * @param file 文件
     * @param objectKey 对象键
     * @return 文件访问路径
     */
    String uploadFile(S3Config config, MultipartFile file, String objectKey);

    /**
     * 上传文件到S3
     *
     * @param config S3配置
     * @param inputStream 输入流
     * @param objectKey 对象键
     * @param contentType 内容类型
     * @return 文件访问路径
     */
    String uploadFile(S3Config config, InputStream inputStream, String objectKey, String contentType);

    /**
     * 获取文件访问URL
     *
     * @param config S3配置
     * @param objectKey 对象键
     * @param expireTime 过期时间（秒）
     * @return 访问URL
     */
    String getFileUrl(S3Config config, String objectKey, Integer expireTime);

    /**
     * 测试S3连接
     *
     * @param config S3配置
     * @return 是否连接成功
     */
    boolean testConnection(S3Config config);

    /**
     * 删除文件
     *
     * @param config S3配置
     * @param objectKey 对象键
     * @return 是否删除成功
     */
    boolean deleteFile(S3Config config, String objectKey);

    /**
     * 从S3下载文件
     *
     * @param config S3配置
     * @param objectKey 对象键
     * @return 文件输入流
     */
    InputStream downloadFile(S3Config config, String objectKey);

    /**
     * 从S3下载文件到字节数组
     *
     * @param config S3配置
     * @param objectKey 对象键
     * @return 文件字节数组
     */
    byte[] downloadFileAsBytes(S3Config config, String objectKey);

    /**
     * 构建带基础路径的完整对象键
     *
     * @param config S3配置
     * @param objectKey 对象键
     * @return 完整对象键
     */
    String buildFullObjectKey(S3Config config, String objectKey);
}